package connect

import "encoding/json"

type Message interface {
	GetData() []byte
}

// 系统消息
type MessageSystem struct {
	System  bool   `json:"system"`
	Id      int    `json:"id"`
	Type    string `json:"type"`
	Content string `json:"content"`
}

func NewMessageSystem(chatId int, messageType string, content string) Message {
	return &MessageSystem{
		System:  true,
		Id:      chatId,
		Type:    messageType,
		Content: content,
	}
}

func (message *MessageSystem) GetData() []byte {
	data, _ := json.Marshal(*message)
	return data
}

// 文本消息
type MessageText struct {
	UserName  string `json:"username"`
	Avatar    string `json:"avatar"`
	GroupId   int    `json:"id"`
	Type      string `json:"type"`
	Content   string `json:"content"`
	Cid       int    `json:"cid"`
	Mine      bool   `json:"mine"`
	FormId    string `json:"formid"`
	TimeStamp int64
}

func (message *MessageText) GetData() []byte {
	data, _ := json.Marshal(*message)
	return data
}

// 个人用户信息
type MessageMineInfo struct {
	Avatar    string `json:"avatar"`
	Content   string `json:"content"`
	Id        string `json:"id"`
	UserName  string `json:"username"`
	Timestamp int64  `json:"timestamp"`
}

func (message *MessageMineInfo) GetData() []byte {
	data, _ := json.Marshal(*message)
	return data
}

// 分组信息
type MessageGroupInfo struct {
	Content   string `json:"content"`
	Id        int    `json:"id"`
	Groupname string `json:"groupname"`
}

func (message *MessageGroupInfo) GetData() []byte {
	data, _ := json.Marshal(*message)
	return data
}

// 用户信息
type MessageFromUser struct {
	Mine *MessageMineInfo       `json:"mine"`
	To   map[string]interface{} `json："to"`
}

func (message *MessageFromUser) GetData() []byte {
	data, _ := json.Marshal(*message)
	return data
}

// 初始化成功信息
type MessageInitSuccess struct {
	Type   string `json:"type"`
	UserId string `json:"user_id"`
}

func NewMessageInitSuccess(userId string) *MessageInitSuccess {
	return &MessageInitSuccess{
		Type:   "init",
		UserId: userId,
	}
}

func (message *MessageInitSuccess) GetData() []byte {
	data, _ := json.Marshal(*message)
	return data
}
